#pragma once
#ifndef SCNET_CORE_HPP
#define SCNET_CORE_HPP

#include "SocketWrapper.hpp"
#include "../ThreadPool.hpp"
#include <string>
#include <memory>
#include <algorithm>

namespace scNet {

	// 前向声明  SocketWrapper类，避免循环依赖
	class SocketWrapper;

	/**
	 * @brief 网络核心实现基类 
	 * 		其他都是继承这个类
	 * 该类提供了网络服务的基本框架，包含了启动和停止网络服务的虚拟方法，
 	 * 以及默认的线程池。用于派生出具体的客户端和服务器核心实现。
	 */
	class NetworkCore {
	protected:
		// 字段
		std::shared_ptr<SocketWrapper> socket_;
		ThreadPool<4> thread_pool_;

		// 默认构造
		NetworkCore() = default;
	public:	
		// 默认析构 给纯虚函数
		virtual ~NetworkCore() = default;

		/**
		 * @brief 启动服务
		 * @param port 监听端口
		 */
		virtual void start(uint16_t port) = 0;

		/**
		 * @brief 停止服务
		 * 停止网络服务 释放资源 给基类接口
		 */
		virtual void stop() = 0;

		// 禁止拷贝构造和赋值
		NetworkCore(const NetworkCore&) = delete;
		NetworkCore& operator=(const NetworkCore&) = delete;

	};

	/**
	 * @brief 客户端核心接口
	 * 
	 * 该类继承自NetworkCore，并提供了与服务器进行通信的接口。
	 * 具体实现应提供连接服务器、发送数据和接收数据的功能。
	 */
	class ClientCore : public NetworkCore {
	public:
		/**
    	 * @brief 连接到服务器
    	 * @param ip 服务器IP
    	 * @param port 服务器端口
    	 * 
    	 * 客户端连接到指定IP和端口的服务器
    	 */
		virtual void connect(const std::string& ip, uint16_t port) = 0;

		/**
    	 * @brief 发送数据
    	 * @return 要发送数据
    	 * 
    	 * 客户端将数据发送到服务器。
    	 */
		virtual void send(const std::string& data) = 0;

		/**
    	 * @brief 接收数据
    	 * @return 接收到的数据
    	 * 
    	 * 客户端从服务器接收数据并返回。
    	 */
		virtual std::string receive() = 0;

	};

	/**
	 * @brief 服务器核心接口
	 * 
	 * 该类继承自NetworkCore，并提供了处理客户端请求的接口。
	 * 具体实现应提供设置请求处理器和处理客户端请求的功能。
	 */
	class ServerCore : public NetworkCore {
	private:
		/* data */
	public:
		// 请求处理器
		/**
    	 * @brief 设置请求处理器
    	 * @param handler 处理函数
    	 * 
    	 * 设置服务器的请求处理函数，该函数将用于处理来自客户端的请求。
    	 */
		virtual void setRequestHandler(std::function<std::string(const std::string&)> handler) = 0;
	};
	
}










#endif // SCNET_CORE_HPP